export const groupListGenerate = (arr) => {
  // 生成小组赛列表，用于小组赛叫号和排序
  // 四个人生成6场比赛
  // 三个人生成三场比赛
  let sortNum = 0
  return arr.reduce((acc, cur, index) => {
    cur.sort = JSON.parse(cur.extendInfo || '{}')
    for (let i = index + 1; i < arr.length; i++) {
      const item = arr[i]
      const key = [item.id, cur.id].sort((a, b) => a - b).join('-')
      const line = {
        ...cur, // 主场方
        key,
        opponentId: item.id, // 对手id
        opponentStudentInfo: item.studentInfo, // 对手信息
      }
      if (cur.sort[item.id] === undefined) {
        // 数据库中没有排序记录 顺序排序
        while (acc[sortNum]) {
          sortNum++
        }
        acc[sortNum] = line
      } else {
        // 数据库中有排序记录，插入到对应位置（位置被占） 或用索引添加
        const sort = cur.sort[item.id]
        if (acc[sort]) {
          acc.splice(sort, 0, line)
        } else {
          acc[sort] = line
        }
      }
    }
    return acc
  }, [])
}

export const groupListSort = (arr) => {
  // 生成小组赛列表，用于生成用于更新的小组赛排序数据
  const result = arr.reduce((acc, cur, index) => {
    // 主场方生成排序数据
    if (!(cur.id in acc)) acc[cur.id] = {}
    if (!(cur.opponentId in acc[cur.id])) {
      // acc[cur.id][cur.opponentId]未添加记录，是null或undefined
      acc[cur.id][cur.opponentId] = index
    }
    // 对手方生成排序数据
    if (!(cur.opponentId in acc)) acc[cur.opponentId] = {}
    if (!(cur.id in acc[cur.opponentId])) {
      // acc[cur.opponentId][cur.id]未添加记录，是null或undefined
      acc[cur.opponentId][cur.id] = index
    }
    return acc
  }, {})
  return Object.keys(result).map((id) => {
    return {
      id,
      extendInfo: JSON.stringify(result[id]),
    }
  })
}

export const groupEditListGenerate = (arr, readOnlyFields) => {
  // 生成小组赛列表，用于小组赛录分
  // 排序
  const vals = {}
  arr.forEach((element) => {
    vals[element.id] = element
    for (const key in element) {
      if (!readOnlyFields.includes(key)) {
        element[key] = null
      }
    }
  })
  const sortResult = groupListGenerate(arr)
  for (let i = sortResult.length - 1; i >= 0; i--) {
    // 比赛数据在groupListGenerate中已经生成，这里只需要添加对手数据即可
    const item = sortResult[i]
    const opponentData = vals[item.opponentId]
    // 给数据添加对手信息
    opponentData.opponentId = item.id
    opponentData.opponentStudentInfo = item.studentInfo
    sortResult.splice(i + 1, 0, { ...opponentData }) // 防止引用赋值
  }
  return sortResult
}
